package com.ma.chapter6.atomic;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;

/***
 * ！！AtomicInteger.updateAndGet()原理
 * ！！函数式编程的引入
 */


public class AtomicTest2 {
    public static void main(String[] args) {
        AtomicInteger i = new AtomicInteger(5);

        /*1、原始 AtomicInteger.updateAndGet() */
        i.updateAndGet(p -> p * 10);
        /*2、updateAndGet 原理！  CAS*/
        //while (true) {
        //    int prev = i.get();
        //    int next = prev * 10;
        //    if(i.compareAndSet(prev,next)){
        //        break;
        //    }
        //}
        /*3、封装函数*/
        System.out.println(updateAndGet(i));
        /*4、函数式编程 */
        System.out.println(updateAndGet(i, p -> p / 2));
        System.out.println(i.get());
    }

    /*问题  算术逻辑被写死，可扩展性低
      ！！！！解决--->要把操作当作变化的参数内容传进来
    将接口当作参数传递进来
    */
    public static int updateAndGet(AtomicInteger i) {
        while (true) {
            int prev = i.get();
            int next = prev * 10;
            if (i.compareAndSet(prev, next)) {
                return next;
            }
        }
    }

    /* ！函数式编程！    策略模式
        解决--->要把操作当作变化的参数内容传进来
        将接口当作参数传递进来
    */
    public static int updateAndGet(AtomicInteger i, IntUnaryOperator operator) {
        while (true) {
            int prev = i.get();
            int next = operator.applyAsInt(prev);
            if (i.compareAndSet(prev, next)) {
                return next;
            }
        }
    }


}
